/**
 * 导入相关样式 
 */
import '../css/common.css'
import '../css/wash.less'

import sendMessage from '../common/sendMessage/message' // 导入发送消息方法
import {balancePay,postWxScan,getBalance,getFlowStatus} from './common/api' // 导入相关api
import {loadingToast} from '../common/weui/weui' // 导入微信toast样式
import {wxPay} from './common/wxJsSdk' // 导入微信支付方法
import {isLogined} from '../common/loginValidate/loginValidate' // 判断是否已经登录
import qs from './common/qs' // 导入参数转换方法
import { getCookie,setCookie } from './common/utils'
import WSUtil from './common/wsutil' // 导入websockr的封装

// 如果已经登录，执行登录后的相关js操作
isLogined(loginedOperation)

function loginedOperation () {
  if (getCookie('washCompleted')==='true') {
    alert('洗车已经完成，请重新扫码')
    location.href = 'index.html'
  }
  loadingToast() // 显示加载中toast

  // let price = 10.00
  // body Dom用于步骤UI
  const bodyDom = document.body
  // 下一步按错
  const nextStepBtn = document.getElementById('nextStepBtn')
  // 步骤对应字段列表，用于UI控制
  const stepStr = ['first','second','third','fourth','fifth']
  // 支付方式列表DOM
  const chooicesList = document.getElementById('chooices').children
  // 显示用时DOM
  const tiemConsumedDom = document.getElementById('tiemConsumed')
  // 显示洗车价格DOM
  const washPrice = document.getElementById('washPrice')
  // 显示余额DOM
  const balance = document.getElementById('balance')
  // 余额支付方式DOM
  const balancePayDom = document.getElementById('balancePay')
  // 声明websock
  let  wsSocket 
  // 定论监听前缀
  const subscribePrefx = '/ws/equipment/'
  // 默认订阅配置
  const defaultSubscribe = {
    name:'11_1',
    subscribe: function(responseData){
      const result = JSON.parse(responseData.body).data
      switch(result.equip_status_value){
      case 0://扫一扫成功（可以不处理）   
        break   
      case 1://支付中   
        break
      case 2://支付成功（可以不处理），支付成功后，自动开始洗车  
        sendMessage({msg:'支付成功，等待开始洗车...'})
        stepIndex = 3
        bodyDom.setAttribute('step',stepStr[3])
        break
      case 3: // 停车到位，放开下一步的禁用
        nextStepBtn.setAttribute('enable','true')
        break
      case 10://开始洗车  
        loadingToast({hide:true})  
        sendMessage({msg:'洗车开始'}) 
        // 记录开始时间
        setCookie('beginTime',new Date().getTime())
        beginTime()
        break
      case 11://运行结束
        washComplete()
        // sendMessage({msg:'洗车结束：用时'+(result.length_of_time/60).toFixed(1) + '分钟'})
        tiemConsumedDom.innerHTML = cumputeTimeStr(parseInt(result.length_of_time))
        wsSocket && wsSocket.lastingClose()//关闭websocket连接，并清除重连工作线程
        break
      case 12://报警类数据
        sendMessage({msg:'警告：'+result.equip_status_name})
        break
        
      default:
        sendMessage({msg:'Unknown'})
        break
        
      }
    },
  }
  const parmas = qs.urlParse()
  // 记录当前步骤
  let stepIndex = 0
  // 保存选中的支付方式
  let payChoosed
  // 用时更新定时器保存变量
  let timeConsumedInter 
  // 记录总用时，单位S
  let timeConsumed = 0

  

  // 未处于洗车流程之中
  if (parmas.status === undefined) {
    // 发送扫码结果
    postWxScan({
      name:qs.urlParse().resultStr || getCookie('resultStr'),
    })
      .then((data)=>{
        buildWsSocket(data)
      })
      .catch(err=>{
        sendMessage({msg:err})
        loadingToast({hide:true})
      })
    
  } else {
    // 处于洗车流程之中
    if (parmas.status === '10' || parmas.status === '2') { // 正在洗车 或支付成功
      stepIndex = 3
        
      if (parmas.status !== '2') {      
        // 支付成功状态，不进行计时，等待洗车开始状态码  
        timeConsumed = new Date().getTime() - getCookie('beginTime')
        timeConsumed = parseInt(timeConsumed/1000)
        beginTime()
      }
      // 建立websock连接
      buildWsSocket({
        price:parseInt(parmas.a),
        balance:999,
        equipmentwsid:getCookie('equipmentwsid'),
      },3)
    } else {
      // 处理其它状态中的相应操作
      // 先获取用户余额
      getBalance({})
        .then((data)=>{
          switch(parmas.status){
          case '0':  // 已经扫码
            stepIndex = 0
            break
          case '3': // 已经停车到位
            nextStepBtn.setAttribute('enable','true')
            stepIndex = 0
            break              
          case '1':  // 支付中        
            nextStepBtn.setAttribute('enable','true')
            stepIndex = 2
            break
          }
          // 建立websock连接
          buildWsSocket({
            price:Number(parmas.a),
            balance:data,
            equipmentwsid:getCookie('equipmentwsid'),
          },stepIndex)
        })
    }
  }  


  /**
   * 将设置操作进行整合，方便两种情况进入洗车流程调用 
   * @param {*} data 
   */
  function buildWsSocket(data,index){

    if (data && data.price!==undefined) {
      
  
      // 本地保存,方便下次直接进入洗车流程
      setCookie('equipmentwsid', data.equipmentwsid)

      //实例化WSUtil自动监控
      wsSocket = new WSUtil('/ws/equipment/endpoint',[Object.assign({},defaultSubscribe,{name:subscribePrefx+'monitor/'+data.equipmentwsid})],function (connected){
        
        if (connected){ // 连接成功才执行相应操作
          stepIndex = index || 0 
          bodyDom.setAttribute('step',stepStr[stepIndex++])
          washPrice.innerHTML = data.price && typeof data.price === 'number' && data.price.toFixed(2) // 更新价格显示
          balance.innerHTML = data.balance.toFixed(2) // 更新余额显示
          if(data.balance<data.price) { // 余额小于价格
            payChoosed = chooicesList[1] // 微信支付为默认选中
            balancePayDom.setAttribute('insufficient','true') // 标记余额不足
          } else {
            payChoosed = chooicesList[0] // 余额支付为默认选中
          }
          // 设置默认支付方式选中状态
          payChoosed.setAttribute('choosed','true')  
          // 隐藏加载中toast
          loadingToast({hide:true})
        }

      })   
    }  
  }
 
  

  // 下一步
  nextStepBtn.addEventListener('click',function(){
    if(this.getAttribute('enable')!=='true') return false 
    // 付款开始
    stepIndex === 3 && paymentOpetation()
    stepIndex < 3 && bodyDom.setAttribute('step',stepStr[stepIndex++])
  })
  // 耗时计算
  function beginTime () {
    // 使用inter每秒更新一次耗时
    timeConsumedInter = setInterval(()=>{

      // 如果未保存起始时间，设置当前时间为起始时间
      !getCookie('beginTime') && setCookie('beginTime',new Date().getTime())
      // 更新耗时
      timeConsumed = parseInt((new Date()-new Date(Number(getCookie('beginTime'))))/1000)
      // 拼接耗时字串
      tiemConsumedDom.innerHTML = cumputeTimeStr(timeConsumed)
      // 查询是否结束
      confirmEnd()
    },1000)
  }
  // 使用接口轮询判断是否洗车结束
  // 解决熄屏后洗车结束不会弹窗的问题
  function confirmEnd() {
    getFlowStatus({})
      .then((data)=>{
        if (data.status === -1 || data.status === 11) {
          // 洗车已经结束或未处于洗车流程之中
          washComplete()
          data.length_of_time && (tiemConsumedDom.innerHTML = cumputeTimeStr(parseInt(data.length_of_time)))
          wsSocket && wsSocket.lastingClose()//关闭websocket连接，并清除重连工作线程
        }
      })
      .catch(()=>{
        loadingToast({hide:true}) // 隐藏加载中toast
      }) 
  }
  // 拼装耗时字体串
  function cumputeTimeStr (seconds) {
    let hour
    let minute
    let second
    // 计算花费小时
    hour = parseInt(seconds/3600)      
    // 计算花费分钟
    minute = parseInt(seconds%3600/60)
    // 计算花费秒
    second =seconds%3600%60
    // hour为零时，hour字段为空
    hour > 0?(hour=hour+':'):(hour='')
    // 分钟小于10于，前面补零
    minute < 10?(minute = '0'+minute):''
    // 秒小于10于，前面补零
    second < 10?(second = '0'+second):''
    return `${hour}${minute}:${second}`
  }
  function washComplete() {
    clearInterval(timeConsumedInter)
    setCookie('washCompleted','true')
    nextStepBtn.setAttribute('enable','false')
    bodyDom.setAttribute('step',stepStr[4])
  }
  // 给支付选项设置选中功能
  for(var i=0; i < chooicesList.length; i++) {
    (function (i) {
      // sendMessage({msg:'事件绑定了'+i})
      chooicesList[i].addEventListener('touchend',function(){
        // parmas.step && (sendMessage({msg:'tocuh事件响应了'}))
        if(this.getAttribute('insufficient')==='true'){
          // 记为余额不足
          sendMessage({msg:'余额不足'})
          return false
        }
        if(this.getAttribute('choosed') !== 'true') {
          // 当前支付方式没有处于选中状态
          payChoosed && payChoosed.setAttribute('choosed','false')
          payChoosed = this
          payChoosed.setAttribute('choosed','true')
        }
      })
    })(i)

  }
  // 支付成功回调
  function paySuccess() {}
  // 支付失败回调
  function fail (err) {
    // bodyDom.setAttribute('step',stepStr[stepIndex++])
    // beginTime()
    sendMessage({msg:'支付失败：' + err}) 
    loadingToast({hide:true})   
  }
  // 支付相关操作
  function paymentOpetation () {
    // 获取选中的支付类型
    let payType = payChoosed.getAttribute('type')
    // 显示toast
    loadingToast()
    if (payType === 'balance') {
      // 余额支付
      balancePay()
        .then(paySuccess)
        .catch(fail)
    } else {
      // 微信支付
      wxPay({
        payInfo:{
          type:1, // 支付类型，1表示洗车
          finalmoney:10, // 支付金额
        },
        success:paySuccess, // 设置成功回调
        fail, // 失败回调
        cancel () { // 取消支付回调
          sendMessage({msg:'您已取消支付操作....'})
        },
        complete () { // 支付操作结束
          loadingToast({hide:true})            
        },
      })
    }
    
  }
  // parmas.step && bodyDom.setAttribute('step',stepStr[parmas.step])
}
